package main 

import (
	"fmt"
	"time"
	"sync"
)

// var x int64
// var wg sync.WaitGroup
// var lock sync.Mutex

// func increment() {
//     lock.Lock()
//     defer lock.Unlock()
//     x = x + 1
// }

// func add() {
// 	defer wg.Done()
// 	for i := 0; i < 5000; i++ {
// 		increment()
// 	}
// }

// func main() {
// 	wg.Add(2)
// 	go add()
// 	go add()
// 	wg.Wait()
// 	fmt.Println(x)
// }

var (
	x 		int64
	wg 		sync.WaitGroup
	// lock    sync.Mutex
	rwlock 	sync.RWMutex 
)

func Write() {
	// lock.Lock()
	rwlock.Lock()
	x = x + 1
	time.Sleep(10 * time.Millisecond)	// 假设写操作耗时10毫秒
	rwlock.Unlock()
	// lock.Unlock()
	wg.Done()
}

func read() {
	// lock.Lock()
    rwlock.RLock()              
    time.Sleep(time.Millisecond) 		// 假设读操作耗时1毫秒
    rwlock.RUnlock()   
	// lock.Unlock()          
    wg.Done()
}

func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go Write()
	}
	for i := 0; i < 1000; i++ {
        wg.Add(1)
        go read()
    }
	wg.Wait()
    end := time.Now()
    fmt.Println(end.Sub(start))
}